"""
@Project: pythonPro1
@Name: p13函数.py
@Author: linxin_liu
@Date: 2022/9/10 16:45
"""

"""
def 函数名（参数列表）:
    函数体
    
参数传递:
在 python 中，类型属于对象，对象有不同类型的区分，变量是没有类型的：
a=[1,2,3] a="Runoob"
以上代码中，[1,2,3] 是 List 类型，
"Runoob" 是 String 类型，
而变量 a 是没有类型，她仅仅是一个对象的引用（一个指针），
可以是指向 List 类型对象，也可以是指向 String 类型对象。

可更改(mutable)与不可更改(immutable)对象
在 python 中，strings, tuples, 和 numbers 是不可更改的对象，
而 list,dict 等则是可以修改的对象。
python 传不可变对象实例、传可变对象实例

参数
以下是调用函数时可使用的正式参数类型：
    1.必需参数 def do(name, age):
    2.关键字参数: 关键字参数和函数调用关系紧密，函数调用使用关键字参数来确定传入的参数值。
        使用关键字参数允许函数调用时参数的顺序与声明时不一致，
        因为 Python 解释器能够用参数名匹配参数值。
        #可写函数说明
        def printinfo( name, age ):
           "打印任何传入的字符串"
           print ("名字: ", name)
           print ("年龄: ", age)
           return
        #调用printinfo函数
        printinfo( age=50, name="runoob" )
    3.默认参数 def do(name, age = 19):
    4.不定长参数
         1)加了星号 * 的参数会以元组(tuple)的形式导入，存放所有未命名的变量参数。
         2)加了两个星号 ** 的参数会以字典的形式导入。
         # 可写函数说明
        def printinfo( arg1, *vartuple ):
           "打印任何传入的参数"
           print ("输出: ")
           print (arg1)
           print (vartuple)
         
        # 调用printinfo 函数
        printinfo( 70, 60, 50 )
        3)声明函数时，参数中星号 * 可以单独出现，例如: def f(a,b,*,c):
          如果单独出现星号 *，则星号 * 后的参数必须用关键字传入：f(1,2,c=3) # 正常
          
    匿名函数
Python 使用 lambda 来创建匿名函数。
所谓匿名，意即不再使用 def 语句这样标准的形式定义一个函数。
    lambda 只是一个表达式，函数体比 def 简单很多。
    lambda 的主体是一个表达式，而不是一个代码块。仅仅能在 lambda 表达式中封装有限的逻辑进去。
    lambda 函数拥有自己的命名空间，且不能访问自己参数列表之外或全局命名空间里的参数。
    虽然 lambda 函数看起来只能写一行，却不等同于 C 或 C++ 的内联函数，后者的目的是调用小函数时不占用栈内存从而增加运行效率
    lambda [arg1 [,arg2,.....argn]]:expression
    x = lambda a : a + 10
    print(x(5)) -> 15 
    sum = lambda arg1, arg2: arg1 + arg2
    
    我们可以将匿名函数封装在一个函数内，这样可以使用同样的代码来创建多个匿名函数。
    以下实例将匿名函数封装在 myfunc 函数中，通过传入不同的参数来创建不同的匿名函数：
    def myfunc(n):
      return lambda a : a * n
    mydoubler = myfunc(2)
    mytripler = myfunc(3)
    print(mydoubler(11)) -> 22
    print(mytripler(11)) -> 33
    
强制位置参数
Python3.8 新增了一个函数形参语法 / 用来指明函数形参必须使用指定位置参数，
不能使用关键字参数的形式。
在以下的例子中，形参 a 和 b 必须使用指定位置参数，
c 或 d 可以是位置形参或关键字形参，而 e 和 f 要求为关键字形参: 
def f(a, b, /, c, d, *, e, f):
    print(a, b, c, d, e, f)
f(10, 20, 30, d=40, e=50, f=60)
以下使用方法会发生错误:
f(10, b=20, c=30, d=40, e=50, f=60)   # b 不能使用关键字参数的形式
f(10, 20, 30, 40, 50, f=60)           # e 必须使用关键字参数的形式
     
"""


def add(a, b, /, c, *, d):
    return a + b + c + d


print(add(1, 2, 3, d=4))



